/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.cesupa.cabcc.facade;

import br.cesupa.cabcc.dao.PerfilDAO;
import br.cesupa.cabcc.dao.UsuarioDAO;
import br.cesupa.cabcc.entity.Usuario;
import br.cesupa.cabcc.factory.FactoryDAO;
import br.cesupa.cabcc.sudi.PerfilSUDI;
import br.cesupa.cabcc.sudi.UsuarioSUDI;
import br.cesupa.cabcc.util.Configuration;
import br.cesupa.cabcc.util.FacesMessages;
import br.cesupa.cabcc.util.GeraSenha;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

/**
 *
 * @author yuri
 */
public class LoginFacade {

    /**
     * metodo que recebe login e senha de um determinado usuario e verifica se o mesmo existe,
     * caso exita verifica se a senha e valida. Caso seja coloca o usuario na sessao.
     */
    public static Usuario efetuaLogin(String login, String senha) {
        /* pega a instancia do UsuarioSUDI */
        UsuarioDAO usuarioDAO = FactoryDAO.getUsuarioSUDI();
        /* procura o usuario pelo login */
        Usuario usuario = usuarioDAO.getByLogin(login);
        if (usuario != null) {
            /* senha identica */
            if (usuario.getSenha().equals(GeraSenha.criptografaSenha(senha))) {
                /* pega a instancia atual do FacesContext */
                FacesContext context = FacesContext.getCurrentInstance();
                /* coloca o usuario na sessao */
                context.getExternalContext().getSessionMap().put(Configuration.SECAO_USUARIO, usuario);
            } /* senha diferente */ else {
                usuario = null;
                FacesMessages.addAlertMessage("login/senha inválidos.");
            }
        } else {
            FacesMessages.addAlertMessage("login/senha inválidos.");
        }
        return usuario;
    }

    public static Usuario cadastrar(Usuario usuario) {
        /* pega a instancia do UsuarioSUDI */
        UsuarioDAO usuarioDAO = FactoryDAO.getUsuarioSUDI();
        /* procura o usuario pelo login */
        Usuario u = usuarioDAO.getByLogin(usuario.getLogin());
        if (usuario.getSenha().length() < 6) {
            FacesMessages.addAlertMessage("o campo senha não pode conter menos que 6 caracteres.");
        } else if (u == null) {
            PerfilDAO perfilDAO = FactoryDAO.getPerfilSUDI();
            usuario.setPerfil(perfilDAO.getByPerfil("COMUM"));
            String senha = usuario.getSenha();
            usuario.setSenha(GeraSenha.criptografaSenha(usuario.getSenha()));

            usuarioDAO.salvar(usuario);
            usuario.setSenha(senha);
        } else {
            FacesMessages.addAlertMessage("já exite um usuário com este login.");
            return null;
        }
        return usuario;
    }

    /**
     * metodo que verifica se o usuario, e ou nao válido na sessao
     */
    public static boolean verificaLogado() {
        /* pega a instancia atual do FacesContext */
        FacesContext context = FacesContext.getCurrentInstance();
        /* verifica se o usuario esta na sessao atual */
        Usuario usuario = (Usuario) context.getExternalContext().getSessionMap().get(Configuration.SECAO_USUARIO);
        return usuario != null;
    }

    /**
     * metodo que retorna o usuario da sessao
     */
    public static Usuario getUsuarioLogado() {
        /* pega a instancia atual do FacesContext */
        FacesContext context = FacesContext.getCurrentInstance();
        /* verifica se o usuario esta na sessao atual */
        Usuario usuario = (Usuario) context.getExternalContext().getSessionMap().get(Configuration.SECAO_USUARIO);
        return usuario;
    }

    /**
     * metodo que mata a sessao
     */
    public static String logout() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        if (session != null) {
            session.invalidate();
        }
        return Configuration.LOGOUT;
    }
}
